package effect.tile;

import character.MyCharacter;
import effect.EffectType;
import effect.character.area.AreaCharacterEffectFactory;
import effect.character.single.SingleCharacterEffectFactory;
import modifier.tile.TileModifierSight;
import modifier.tile.TileModifierWalk;

public class TileEffectFactory {
    
    public static TileEffect getTileEffect(MyCharacter owner, TileEffectEnum tileEffectEnum) {
        TileEffect tileEffect = new TileEffect(owner);
        populateTileEffect(tileEffect, tileEffectEnum);
        if(tileEffectEnum.getEffectType() == EffectType.TILE_SIMPLE) {
            switch(tileEffectEnum) {
                case SIGHT:
                    tileEffect.addTileModifier(new TileModifierSight(owner, tileEffectEnum.getBaseDuration()));
                    break;
            }
        } else if(tileEffectEnum.getEffectType() == EffectType.TILE_WALK) {
            if(tileEffectEnum.getSingleCharacterEffectEnum() != null) {
                tileEffect.addTileModifier(new TileModifierWalk(owner, SingleCharacterEffectFactory.getSingleCharacterEffect(owner, tileEffectEnum.getSingleCharacterEffectEnum()), tileEffectEnum.getBaseDuration()));
            } else if(tileEffectEnum.getAreaCharacterEffectEnum() != null) {
                tileEffect.addTileModifier(new TileModifierWalk(owner, AreaCharacterEffectFactory.getAreaCharacterEffect(owner, tileEffectEnum.getAreaCharacterEffectEnum()), tileEffectEnum.getBaseDuration()));
            }
        }
        return tileEffect;
    }
    
    protected static void populateTileEffect(TileEffect tileEffect, TileEffectEnum tileEffectEnum) {
        tileEffect.setEffectName(tileEffectEnum.getEffectName());
        tileEffect.setEffectType(tileEffectEnum.getEffectType());
	tileEffect.setBaseSpeed(tileEffectEnum.getBaseSpeed());
	tileEffect.setRangePattern(tileEffectEnum.getRangePattern());
	tileEffect.setRangeSize(tileEffectEnum.getRangeSize());
	tileEffect.setEffectPattern(tileEffectEnum.getEffectPattern());
	tileEffect.setEffectSize(tileEffectEnum.getEffectSize());
        tileEffect.setBaseDuration(tileEffectEnum.getBaseDuration());
    }
}
